EC-CUBE 2.11.4
[ class tree: EC-CUBE 2.11.4 ] [ index: EC-CUBE 2.11.4 ] [ all elements ]

Source for file SC_GraphLine.php

Documentation is available at SC_GraphLine.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. $ownDir realpath(dirname(__FILE__)) '/';
  25. require_once $ownDir 'SC_GraphBase.php';
  26.  
  27. // 折れ線グラフ生成クラス
  28. class SC_GraphLine extends SC_GraphBase{
  29.     var $area_width;
  30.     var $area_height;
  31.     var $ygrid_on;
  32.     var $graph_max;     // グラフのエリア最大値(Y軸頂点の値)
  33.     var $arrXLabel;
  34.     var $XLabelAngle;   // X軸ラベル角度
  35.     var $XTitle;        // X軸タイトル
  36.     var $YTitle;        // Y軸タイトル
  37.     var $arrDataList;   // グラフデータを格納
  38.     var $arrPointList;  // 折れ線座標を格納
  39.     var $line_max;      // 複数の描画の場合に加算していく
  40.  
  41.     var $x_margin;
  42.     var $y_margin;
  43.  
  44.     // コンストラクタ
  45.     function SC_GraphLine(
  46.         $bgw BG_WIDTH$bgh BG_HEIGHT$left LINE_LEFT$top LINE_TOP,
  47.         $area_width LINE_AREA_WIDTH$area_height LINE_AREA_HEIGHT{
  48.         parent::SC_GraphBase($bgw$bgh$left$top);
  49.         $this->area_width = $area_width;
  50.         $this->area_height = $area_height;
  51.         $this->ygrid_on = true;
  52.         $this->line_max = 0;
  53.         $this->graph_max = 0;
  54.         $this->XLabelAngle = 0;
  55.         $this->x_margin = 0;
  56.         $this->y_margin = 0;
  57.     }
  58.  
  59.     // X軸ラベルの角度セット
  60.     function setXLabelAngle($Angle{
  61.         $this->XLabelAngle = $Angle;
  62.     }
  63.  
  64.     // Y軸タイトル
  65.     function drawYTitle({
  66.         // Y軸にタイトルを入れる
  67.         if($this->YTitle != ""{
  68.             $text_width $this->getTextWidth($this->YTitleFONT_SIZE);
  69.             $x_pos $this->left ($text_width 2);
  70.             $y_pos $this->top FONT_SIZE LINE_YTITLE_PAD;
  71.             $this->setText(FONT_SIZE$x_pos$y_pos$this->YTitle);
  72.         }
  73.     }
  74.  
  75.     // X軸タイトル
  76.     function drawXTitle({
  77.         // Y軸にタイトルを入れる
  78.         if($this->XTitle != ""{
  79.             $text_width $this->getTextWidth($this->XTitleFONT_SIZE);
  80.             $x_pos $this->left $this->area_width - ($text_width 230;
  81.             $y_pos $this->top $this->area_height + LINE_XTITLE_PAD;
  82.             $this->setText(FONT_SIZE$x_pos$y_pos$this->XTitle);
  83.         }
  84.     }
  85.  
  86.     // Y軸の描画
  87.     function drawYLine({
  88.         imageline($this->image$this->left$this->top$this->left$this->top $this->area_height$this->flame_color);
  89.         // 目盛り幅を求める(中間点は自動)
  90.         $size $this->area_height / (LINE_Y_SCALE 2);
  91.         // 上から目盛りを入れていく
  92.         $pos 0;
  93.         for($i 0$i (LINE_Y_SCALE 2)$i++{
  94.             // 目盛り幅
  95.             if(($i 2== 0{
  96.                 $sw LINE_SCALE_SIZE;
  97.                 if($this->ygrid_on{
  98.                     imageline($this->image$this->left$this->top $pos$this->left $this->area_width$this->top $pos$this->grid_color);
  99.                 }
  100.             else {
  101.                 $sw LINE_SCALE_SIZE 2;
  102.             }
  103.             imageline($this->image$this->left$this->top $pos$this->left $sw$this->top $pos$this->flame_color);
  104.             $pos += $size;
  105.         }
  106.         // Y軸に目盛り値を入れる
  107.         $this->setYScale();
  108.         $this->drawYTitle();
  109.     }
  110.  
  111.     // X軸の描画
  112.     function drawXLine($bar false{
  113.         imageline($this->image$this->left$this->top $this->area_height$this->left $this->area_width$this->top $this->area_height$this->flame_color);
  114.         $arrPointList $this->arrPointList[0];
  115.         $count count($arrPointList);
  116.  
  117.         // 棒グラフの場合は半目盛りずらす
  118.         if($bar{
  119.             $half_scale intval($this->area_width / ($count 12);
  120.         else {
  121.             $half_scale 0;
  122.         }
  123.  
  124.         // ラベルの表示インターバルを算出
  125.         $interval ceil($count LINE_XLABEL_MAX)// 切り上げ
  126.         for($i 0$i $count$i++{
  127.             // X軸に目盛りを入れる
  128.             $x $arrPointList[$i][0];
  129.             $pos $this->top $this->area_height;
  130.             imageline($this->image$x $half_scale$pos$x $half_scale$pos LINE_SCALE_SIZE,  $this->flame_color);
  131.             // ラベルを入れる
  132.             if(($i $interval== 0{
  133.                 $text_width $this->getTextWidth($this->arrXLabel[$i]FONT_SIZE);
  134.                 $x_pos $x;
  135.  
  136.                 if ($bar{
  137.                     $bar_margin = -15;
  138.                 else {
  139.                     $bar_margin 0;
  140.                 }
  141.  
  142.                 $this->setText(FONT_SIZE$x_pos $this->x_margin + $bar_margin$pos FONT_SIZE $this->y_margin$this->arrXLabel[$i]NULL$this->XLabelAngle);
  143.             }
  144.         }
  145.  
  146.         // 棒グラフの場合は最後の目盛りを一つ追加する
  147.         if($bar{
  148.             imageline($this->image$x $half_scale$pos$x $half_scale$pos LINE_SCALE_SIZE,  $this->flame_color);
  149.         }
  150.  
  151.         $this->drawXTitle();
  152.     }
  153.  
  154.     // グリッド表示
  155.     function setYGridOn($ygrid_on{
  156.         $this->ygrid_on = $ygrid_on;
  157.     }
  158.  
  159.     // ポイントの描画
  160.     function setMark($line_no$left$top$size LINE_MARK_SIZE{
  161.         // 偶数に変換しておく
  162.         $size += $size 2;
  163.         $array array(
  164.             $left$top ($size 2),
  165.             $left ($size 2)$top,
  166.             $left$top ($size 2),
  167.             $left ($size 2)$top,
  168.         );
  169.         imagefilledpolygon($this->image$array4$this->arrColor[$line_no]);
  170.         imagepolygon($this->image$array4$this->flame_color);
  171.         imagesetpixel ($this->image$left$top ($size 2)$this->flame_color);
  172.     }
  173.  
  174.     // Y軸目盛りに値を入れる
  175.     function setYScale({
  176.         // 1目盛りの値
  177.         $number intval($this->graph_max / LINE_Y_SCALE);
  178.         // 目盛り幅を求める
  179.         $size $this->area_height / LINE_Y_SCALE;
  180.         $pos 0;
  181.         for($i 0$i <= LINE_Y_SCALE$i++{
  182.             $snumber $number (LINE_Y_SCALE $i);
  183.             $disp_number number_format($snumber);
  184.             $num_width $this->getTextWidth($disp_numberFONT_SIZE);
  185.             $this->setText(FONT_SIZE$this->left $num_width 2$this->top $pos (FONT_SIZE 2)$disp_number);
  186.             $pos += $size;
  187.         }
  188.     }
  189.  
  190.     //
  191.     function setMax($arrData{
  192.         // データの最大値を取得する。
  193.         $data_max max($arrData);
  194.         // 10の何倍かを取得
  195.         $figure strlen($data_max1;
  196.         // 次の桁を計算する
  197.         $tenval pow(10$figure);
  198.         // グラフ上での最大値を求める
  199.         $this->graph_max = $tenval (intval($data_max $tenval1);
  200.         // 最大値が10未満の場合の対応
  201.         if($this->graph_max < 10{
  202.             $this->graph_max = 10;
  203.         }
  204.     }
  205.  
  206.     // グラフの描画
  207.     function drawGraph({
  208.         // グラフ背景を描画
  209.         $this->drawYLine();
  210.         $this->drawXLine();
  211.  
  212.         // 折れ線グラフ描画
  213.         for($i 0$i $this->line_max$i++{
  214.             $this->drawLine($i);
  215.         }
  216.  
  217.         // マークを描画
  218.         for($i 0$i $this->line_max$i++{
  219.             $this->drawMark($i);
  220.         }
  221.  
  222.         // ラベルを描画
  223.         for($i 0$i $this->line_max$i++{
  224.             $this->drawLabel($i);
  225.         }
  226.  
  227.         // 凡例の描画
  228.         $this->drawLegend();
  229.     }
  230.  
  231.     // ラインを描画する
  232.     function drawLine($line_no{
  233.         $arrPointList $this->arrPointList[$line_no];
  234.  
  235.         $count count($arrPointList);
  236.         for($i 0$i $count$i++{
  237.             $x $arrPointList[$i][0];
  238.             $y $arrPointList[$i][1];
  239.             if(isset($arrPointList[$i 1])) {
  240.                 $next_x $arrPointList[$i 1][0];
  241.                 $next_y $arrPointList[$i 1][1];
  242.                 imageline($this->image$x$y$next_x$next_y$this->arrColor[$line_no]);
  243.             }
  244.         }
  245.     }
  246.  
  247.     // マークを描画する
  248.     function drawMark($line_no{
  249.         $arrPointList $this->arrPointList[$line_no];
  250.         $count count($arrPointList);
  251.         for($i 0$i $count$i++{
  252.             $x $arrPointList[$i][0];
  253.             $y $arrPointList[$i][1];
  254.             $this->setMark($line_no$x$y);
  255.         }
  256.     }
  257.  
  258.     // ラベルを描画する
  259.     function drawLabel($line_no{
  260.         $arrData $this->arrDataList[$line_no];
  261.         $arrPointList $this->arrPointList[$line_no];
  262.         $count count($arrPointList);
  263.         for($i 0$i $count$i++{
  264.             $x $arrPointList[$i][0];
  265.             $y $arrPointList[$i][1];
  266.             $text_width $this->getTextWidth(number_format($arrData[$i])FONT_SIZE);
  267.             $y_pos $y FONT_SIZE 5;
  268.             $x_pos $x $text_width 2;
  269.             $this->setText(FONT_SIZE$x_pos$y_posnumber_format($arrData[$i]));
  270.         }
  271.     }
  272.  
  273.     // データをセットする
  274.     function setData($arrData{
  275.         $this->arrDataList[$this->line_maxarray_values((array)$arrData);
  276.         $this->setMax($this->arrDataList[$this->line_max]);
  277.         // 値の描画変換率
  278.         $rate $this->area_height / $this->graph_max;
  279.         // 描画率を計算
  280.         $count count($this->arrDataList[$this->line_max]);
  281.         $scale_width $this->area_width / ($count 1);
  282.         $this->arrPointList[$this->line_maxarray();
  283.         for($i 0$i $count$i++{
  284.             // X座標を求める
  285.             $x intval($this->left ($scale_width ($i 1)));
  286.             // Y座標を求める
  287.             $y intval($this->top $this->area_height - ($this->arrDataList[$this->line_max][$i$rate));
  288.             // XY座標を保存する
  289.             $this->arrPointList[$this->line_max][array($x$y);
  290.         }
  291.         $this->line_max++;
  292.     }
  293.  
  294.     // X軸ラベルをセットする
  295.     function setXLabel($arrXLabel{
  296.         $this->arrXLabel = array_values((array)$arrXLabel);
  297.     }
  298.  
  299.     // X軸タイトルをセットする
  300.     function setXTitle($title{
  301.         $this->XTitle = $title;
  302.     }
  303.  
  304.     // Y軸タイトルをセットする
  305.     function setYTitle($title{
  306.         $this->YTitle = $title;
  307.     }
  308. }
  309. ?>

Documentation generated on Fri, 24 Feb 2012 14:02:37 +0900 by Seasoft